/***************************************************************************/
/*                                                                         */
/*  ftmisc.h                                                               */
/*                                                                         */
/*    Miscellaneous macros for stand-alone rasterizer (specification       */
/*    only).                                                               */
/*                                                                         */
/*  Copyright 2005, 2009, 2010 by                                          */
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
/*                                                                         */
/*  This file is part of the FreeType project, and may only be used        */
/*  modified and distributed under the terms of the FreeType project       */
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
/*  this file you indicate that you have read the license and              */
/*  understand and accept it fully.                                        */
/*                                                                         */
/***************************************************************************/


/***************************************************/
/*                                                 */
/* This file is *not* portable!  You have to adapt */
/* its definitions to your platform.               */
/*                                                 */
/***************************************************/

#ifndef __FTMISC_H__
#define __FTMISC_H__


/* memset */
#include FT_CONFIG_STANDARD_LIBRARY_H

#define FT_BEGIN_HEADER
#define FT_END_HEADER

#define FT_LOCAL_DEF( x )   static x


/* from include/freetype2/fttypes.h */

typedef unsigned char FT_Byte;

typedef signed int FT_Int;

typedef unsigned int FT_UInt;

typedef signed long FT_Long;

typedef unsigned long FT_ULong;

typedef signed long FT_F26Dot6;

typedef int FT_Error;

#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
          ( ( (FT_ULong)_x1 << 24 ) |     \
            ( (FT_ULong)_x2 << 16 ) |     \
            ( (FT_ULong)_x3 <<  8 ) |     \
              (FT_ULong)_x4         )


/* from include/freetype2/ftsystem.h */

typedef struct FT_MemoryRec_ *FT_Memory;

typedef void *(*FT_Alloc_Func)( FT_Memory memory,
                                long size );

typedef void (*FT_Free_Func)( FT_Memory memory,
                              void *block );

typedef void *(*FT_Realloc_Func)( FT_Memory memory,
                                  long cur_size,
                                  long new_size,
                                  void *block );

typedef struct FT_MemoryRec_
{
    void *user;

    FT_Alloc_Func alloc;
    FT_Free_Func free;
    FT_Realloc_Func realloc;

} FT_MemoryRec;


/* from src/ftcalc.c */

#if ( defined _WIN32 || defined _WIN64 )

typedef __int64  FT_Int64;

#else

#include "inttypes.h"

typedef int64_t FT_Int64;

#endif


static FT_Long
FT_MulDiv( FT_Long a,
           FT_Long b,
           FT_Long c )
{
    FT_Int s;
    FT_Long d;


    s = 1;
    if ( a < 0 )
    {
        a = -a;
        s = -1;
    }
    if ( b < 0 )
    {
        b = -b;
        s = -s;
    }
    if ( c < 0 )
    {
        c = -c;
        s = -s;
    }

    d = ( FT_Long ) ( c > 0 ? (( FT_Int64 ) a * b + ( c >> 1 )) / c
                            : 0x7FFFFFFFL );

    return ( s > 0 ) ? d : -d;
}


static FT_Long
FT_MulDiv_No_Round( FT_Long a,
                    FT_Long b,
                    FT_Long c )
{
    FT_Int s;
    FT_Long d;


    s = 1;
    if ( a < 0 )
    {
        a = -a;
        s = -1;
    }
    if ( b < 0 )
    {
        b = -b;
        s = -s;
    }
    if ( c < 0 )
    {
        c = -c;
        s = -s;
    }

    d = ( FT_Long ) ( c > 0 ? ( FT_Int64 ) a * b / c
                            : 0x7FFFFFFFL );

    return ( s > 0 ) ? d : -d;
}

#endif /* __FTMISC_H__ */


/* END */
